<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>现代原型</title>
</head>
<body>
<script>
    /*
    * 我们之前设置对象的原型一般都是先创建然后设置对象的原型属性
    *
    * */
        function User(name){
            this.name = name
        }

        let user = new User("Alice")

    user.__proto__.getName = function (){
        console.log(this.name)
    }
      user.getName()


    /*
    * 但是我们一般不会直接操作对象的__proto__属性
    * Object.setPrototypeOf 可以使用这个方法修改对象的原型属性  也就意味着对象的原型不是一定在构造函数中被固定，也可以通过对象去动态修改
    * */

    Object.setPrototypeOf(user,{age:12})

    console.log(user.age)

    /*
    * 我们还可以通过原型来创建一个对象 而不是先创建对象再来设置原型
    *
    * */

    let animal ={
        age:12
    }

/*通过原型来创建一个对象 并将该原型对象作为创建出来的对象的原型对象*/
 let dog =  Object.create(animal)
    console.log(dog.age)



    /*
    * 使用这种方法操作不仅可以设置对象的原型还可以动态为对象设置属性
    * */
 let cat = Object.create(animal,{
     type:{
         value: 'cat'
     },
     month:{
         get(){
             return 24
         }
     }
 })

    console.log("---------")
    console.log(cat.type)
    console.log(cat.month)


</script>
</body>
</html>